#pragma once

#include <Arduino.h>
#include "Screen.h"
#include "Keys.h"

// 俄罗斯方块游戏类
class Tetris {
public:
  // 游戏入口
  void main(Screen &screen, Keys &keys);

private:
  // 游戏常量
  static const int GRID_WIDTH = 10;   // 游戏区域宽度（格子数）
  static const int GRID_HEIGHT = 40;  // 游戏区域高度（格子数）
  static const int BLOCK_SIZE = 14;   // 每个方块的像素大小
  static const int PREVIEW_SIZE = 4;  // 预览区域方块数

  // 方块类型数量
  static const int TETROMINO_TYPES = 7;

  // 游戏区域偏移
  static const int GAME_OFFSET_X = 2;
  static const int GAME_OFFSET_Y = 2;

  // 预览区域位置
  static const int PREVIEW_X = 140;
  static const int PREVIEW_Y = 30;

  // 下一个方块预览位置
  static const int NEXT_Y = 2;

  // 信息显示位置
  static const int INFO_X = 140;
  static const int SCORE_Y = PREVIEW_Y + PREVIEW_SIZE * BLOCK_SIZE + 10;
  static const int SCORE_V_Y = SCORE_Y + 20;
  static const int LEVEL_Y = SCORE_V_Y + 20;
  static const int LEVEL_V_Y = LEVEL_Y + 20;
  static const int LINES_Y = LEVEL_V_Y + 20;
  static const int LINES_V_Y = LINES_Y + 20;
  static const int CONTROL_Y = LINES_V_Y + 30;
  static const int CONTROL_C_Y = CONTROL_Y + 20;

  // 方块形状定义（7种方块，每种4个旋转状态）
  // 每个方块用4x4的矩阵表示
  static const bool SHAPES[7][4][4][4];

  // 方块颜色
  static const uint16_t COLORS[7];

  // 游戏状态
  int grid[GRID_HEIGHT][GRID_WIDTH];  // 游戏场地，0表示空，其他数字表示方块类型+1
  int currentType;                    // 当前方块类型
  int currentRotation;                // 当前旋转状态
  int currentX;                       // 当前方块X坐标
  int currentY;                       // 当前方块Y坐标
  int nextType;                       // 下一个方块类型

  unsigned long score;         // 分数
  int level;                   // 等级
  int lines;                   // 消除的行数
  int dropInterval;            // 下落间隔（毫秒）
  unsigned long lastDropTime;  // 上次下落时间
  unsigned long lastMoveTime;  // 上次移动时间

  bool gameOver;  // 游戏结束标志
  bool paused;    // 暂停标志

  // 初始化游戏
  void initGame();

  // 绘制游戏界面
  void drawGameArea(Screen &screen);
  void drawGrid(Screen &screen);
  void drawTetromino(Screen &screen, int type, int rotation, int x, int y, uint16_t color);
  void drawCurrentTetromino(Screen &screen);
  void drawPreview(Screen &screen);
  void drawInfo(Screen &screen);
  void drawGameOver(Screen &screen);

  // 游戏逻辑
  void spawnTetromino();
  bool canMove(int type, int rotation, int x, int y);
  void lockTetromino();
  int clearLines();
  void updateLevel();
  bool moveDown();
  void moveLeft();
  void moveRight();
  void rotate();
  void hardDrop();

  // 输入处理
  void handleInput(Keys &keys);

  // 工具函数
  void clearGridCell(Screen &screen, int gridX, int gridY);
  void drawGridCell(Screen &screen, int gridX, int gridY, uint16_t color);
  int getPixelX(int gridX);
  int getPixelY(int gridY);
};
